 /*
 * Разработчик: Коледа Андрей
 * Дата: 21.01.2011
 * Время: 14:28
 * Email: koleda.andrey@gmail.com
 */
using System;
using System.Collections.Generic;
using System.Reflection;

namespace FastTravel.DB.Helpers
{
	/// <summary>
	/// Класс расширения enum
	/// </summary>
	public class EnumMetadataConverter
	{
		/// <summary>
		/// Получить значения атрибутов из метаданных
		/// </summary>
		/// <param name="enumType">Enum у которого получить</param>
		/// <returns>Перечисление значения атрибутов</returns>
		public static Dictionary<int, string> GetListItems(Type enumType)
		{
			if (!enumType.IsEnum)
				throw new ApplicationException("GetListItems не поддерживает не-enum типы");
			Dictionary<int, string> list = new Dictionary<int, string>();
			foreach (FieldInfo field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public))
			{
				int value;
				string display;
				value = (int)field.GetValue(null);
				display = Enum.GetName(enumType, value);
				foreach (Attribute currAttr in field.GetCustomAttributes(true))
				{
					EnumValueDataAttribute valueAttribute = currAttr as EnumValueDataAttribute;
					if (valueAttribute != null)
						display = valueAttribute.Name;
				}
				list.Add(value, display);
			}
			return list;
		}

		/// <summary>
		/// Получение значения атрибута конкретного (указанного) элемента enum
		/// </summary>
		/// <param name="value">Элемент enum</param>
		/// <example>string value = UserRoleEnum.Administrator.GetStringValue();</example>
		/// <returns>Значение атрибута</returns>
		public static string GetStringValue(Enum value)
		{
			Type type = value.GetType();
			FieldInfo fieldInfo = type.GetField(value.ToString());
			EnumValueDataAttribute[] attribs = fieldInfo.GetCustomAttributes(
				typeof(EnumValueDataAttribute), false) as EnumValueDataAttribute[];
			return attribs.Length > 0 ? attribs[0].Name : null;
		}

		/// <summary>
		/// Возвращает элемент enum по индексу
		/// </summary>
		/// <typeparam name="T">Перечисление</typeparam>
		/// <param name="number">Индекс</param>
		/// <example>DaysOfWeek d  = NumToEnum<DaysOfWeek>(int day = 5);</example>
		/// <returns></returns>
		public static T NumToEnum<T>(int number)
		{
			return (T)Enum.ToObject(typeof(T), number);
		}
	}
}
